package GenericStudy.Exa0;

/**
 * 泛型方法学习：
 * 泛型方法其实就是带有类型参数的方法，泛型方法的好处和泛型类一样，便于编写通用方法，提高工作效率。
 * 泛型方法既可以在泛型类中定义，也可以定义在普通类中。
 * 在编写泛型方法之前，我们一定要知道使用这个方法的类型范围(可以通过类型限定来解决，限定的类型在虚拟机中作为原始类型替换掉泛型)，以免造成逻辑错误！！
 * 下面的betterMinMax方法是个标志的泛型方法
 *
 */
public class Test{

    public static void main(String[] args) {
        //泛型类和泛型方法的使用
        String[] words={"1","2"};
        Pari<String> result = betterMinMax(words);
        System.out.println("min = "+result.getFirst());
        System.out.println("max = "+result.getSecond());
    }

    /**
     * 非泛型方法,强制指定参数类型
     * @param a
     * @return
     */
    public static Pari<String> minMax(String[] a){
        if(a==null||a.length==0) return null;
        String min=a[0];
        String max=a[0];
        for(int i=0;i<a.length;i++){
            if(min.compareTo(a[i])>0) min=a[i];
            if(max.compareTo(a[i])<0) max=a[i];
        }
        return new Pari<>(min,max);
    }

    /**
     * 泛型方法，参数类型是泛型，可以处理多种不同的对象
     * @param a 泛型数组
     * @param <T> 类型参数
     * @return
     */
    public static <T extends Comparable<T>> Pari<T> betterMinMax(T[] a){
        if(a==null||a.length==0) return null;
        T min=a[0];
        T max=a[0];
        for(int i=1;i<a.length;i++){
            if(min.compareTo(a[i])>0) min = a[i];
            if(max.compareTo(a[i])<0) max = a[i];
        }
        return new Pari<>(min,max);
    }

    /**
     * 泛型方法，参数类型是泛型，
     * 可以处理多种不同类型
     * @param a
     * @param <T>
     * @return
     */
    public static <T> T getMiddle(T[] a){
        return a[a.length/2];
    }

    /**
     * 泛型方法，参数类型是泛型，可以处理多种不同类型
     * @param a
     * @param <T>
     * @return
     */
    public static <T extends Comparable<T>> T min(T[] a){
        if(a==null||a.length==0) return null;
        T smallest=a[0];
        for(int i=1;i<a.length;i++){
            if(smallest.compareTo(a[i])>0)
                smallest=a[i];
        }
        return smallest;
    }

}
